package com.xrit.sunnyday.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.StringUtil;
import com.xrit.sunnyday.dao.MenuDao;
import com.xrit.sunnyday.dao.PermissionDao;
import com.xrit.sunnyday.dao.RoleDao;
import com.xrit.sunnyday.dao.UserDao;
import com.xrit.sunnyday.entity.PageResult;
import com.xrit.sunnyday.entity.QueryPageBean;
import com.xrit.sunnyday.exception.SunnydayException;
import com.xrit.sunnyday.pojo.Role;
import com.xrit.sunnyday.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

/**
 * @author Daoying
 * creationTime: 2022/10/25 14:37
 */
@Service(interfaceClass = RoleService.class)
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleDao roleDao;

    @Autowired
    PermissionDao permissionDao;

    @Autowired
    MenuDao menuDao;

    @Autowired
    UserDao userDao;

    /*
     * 分页查询
     * */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {

        // 拼接%
        if (!StringUtil.isEmpty(queryPageBean.getQueryString())) {
            queryPageBean.setQueryString("%" + queryPageBean.getQueryString() + "%");
        }

        // 使用静态方法，pageheleper
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());

        // 紧接着的查询语句会被分页
        // Page 是pageHelper对象, 分页信息
        List<Role> list = roleDao.findAll(queryPageBean.getQueryString());

        PageInfo<Role> pageInfo = new PageInfo<>(list);
        // 包装到PageResult 再返回
        // 1 解耦
        // 2 total是基本类型，丢失。
        // 3 page对象内容过多 total,rows
        return new PageResult(pageInfo.getTotal(), pageInfo.getList());
    }

    /*
     * 通过id查询
     * */
    @Override
    public Role findById4Edit(int id) {
        return roleDao.findById4Edit(id);
    }

    /**
     * 添加角色与权限
     *
     * @param role
     * @param permissionIds
     */
    @Override
    public void RoleAdd(Role role, Integer[] permissionIds, Integer[] menus) {
//        添加角色
        roleDao.RoleAdd(role);
//        判断checkGroupIds是否有值
        if (permissionIds != null) {
            for (Integer permissionId : permissionIds) {
//                建立角色与权限的关系
                permissionDao.RolePermissionAdd(role.getId(), permissionId);
            }
        }
        if (menus != null) {
            for (Integer menuId : menus) {
                menuDao.RoleMenuAdd(role.getId(), menuId);
            }
        }
    }

    /**
     * 删除角色
     *
     * @param id
     */
    @Override
    public void RoleDelete(Integer id) throws SunnydayException {
//        根据RoleID判断是否与用户有关系
        Integer integer = userDao.findUserRole(id);
        if (integer > 0) {
//            如果有关系则不能删除
            throw new SunnydayException("该角色已被用户关联则不能删除！");
        }
//        判断是否与权限有关系
        Integer integer1 = permissionDao.QueryRolePermissionByRoleId(id);
        if (integer1 > 0) {
//            有关系解除关系
            permissionDao.RolePermissionDeleteByRoleId(id);
        }
//        并且还要判断是否与菜单有关系
        Integer integer2 = menuDao.QueryRoleMenuByRoleId(id);
        if (integer2 > 0) {
//            与菜单有关系解除关系
            menuDao.RoleMenuDeleteByRoleId(id);
        }
        roleDao.RoleDelete(id);
    }

    /**
     * 根据角色ID修改角色信息
     *
     * @param role
     * @param permissionIds
     * @param menus
     */
    @Override
    public void RoleUpdate(Role role, Integer[] permissionIds, Integer[] menus) {
//        修改角色基本信息
        roleDao.RoleUpdate(role);
//        修改角色与权限的关系 先根据角色ID删除角色与权限的全部关系
        permissionDao.RolePermissionDeleteByRoleId(role.getId());
        for (Integer permissionId : permissionIds) {
//            然后角色根据权限ID重新建立关系
            permissionDao.RolePermissionAdd(role.getId(), permissionId);
        }
//        修改角色与菜单的关系 先根据角色ID删除角色与菜单的全部关系
        menuDao.RoleMenuDeleteByRoleId(role.getId());
        for (Integer menuId : menus) {
            System.out.println(menuId);
//            然后角色根据菜单ID重新建立关系
            menuDao.RoleMenuAdd(role.getId(), menuId);
        }
    }


}
